## 5.6. The /proc filesystem

Unix systems have come a long way with respect to providing uniform interfaces to different parts of the system; as you will learn in the next chapter, hardware is represented in Linux in the form of a special type of file. There is, however, a special filesystem called the /proc filesystem that goes even one step further: it unifies files and processes.

From the user's or the system administrator's point of view, the /proc filesystem looks just like any other filesystem; you can navigate around it with the `cd` command, list directory contents with the `ls` command and view file contents with the `cat` command. However, none of these files and directories occupy any space on your hard disk. The kernel traps accesses to the /proc filesystem and generates directory and file contents on the fly. In other words, whenever you list or directory or view file contents in the /proc filesystem, the kernel dynamically generates the contents you want to see.

To make this less abstract, let's see some examples. The following example displays the list of files in the top-level directory of the /proc filesystem:

>     tigger # ls /proc
>     1          184        25472      8          8525         kmsg
>     130        185        25475      82         8526         ksyms
>     134        186        25497      8484       8593         loadavg
>     136        187        25498      8485       963          locks
>     139        2          25499      8488       965          meminfo
>     143        24924      25500      8489       9654         modules
>     144        25441      25515      8492       968          mounts
>     145        25442      25549      8496       97           net
>     146        25445      25550      8507       99           pci
>     147        25446      26019      8508       cmdline      scsi
>     148        25449      26662      8510       cpuinfo      self
>     151        25451      26663      8511       devices      stat
>     163        25462      270        8512       dma          sys
>     168        25463      3          8520       filesystems  uptime
>     172        25464      4484       8522       interrupts   version
>     180        25465      4639       8523       ioports
>     182        25466      55         8524       kcore

The numbers will be different on your system, but the general organization will be the same. All those numbers are directories that represent one of the processes running on your system each. For example, let's look at the information about the process with the ID 172:

>     tigger # ls /proc/172
>     cmdline  environ  fd       mem      stat     status
>     cwd      exe      maps     root     statm

You see a number of files that each contain information about this process. For example, the cmdline file shows the command line with which this process was started. status gives information about the internal state of the process and cwd links to the current working directory of this process.

Probably you'll find the hardware information even more interesting than the process information. All the information that the kernel has gathered about your hardware is collected in the /proc filesystem, even though it can be difficult to find the information you are looking for.

Let's start by checking your machine's memory. This is represented by the file /proc/meminfo:

>     tigger # cat /proc/meminfo
>             total:    used:    free:  shared: buffers:  cached:
>     Mem:  130957312 128684032  2273280 37888000  3198976 20615168
>     Swap: 133885952 64434176 69451776
>     MemTotal:    127888 kB
>     MemFree:       2220 kB
>     MemShared:    37000 kB
>     Buffers:       3124 kB
>     Cached:       20132 kB
>     SwapTotal:   130748 kB
>     SwapFree:     67824 kB

If you then try the command `free`, you can see that that is exactly the same information, only the numbers are reformatted a bit. `free` does nothing more than read /proc/meminfo and rearrange the output a bit.

Most tools on your system that report information about your hardware do it this way. The /proc filesystem is a portable and easy way to get at this information. The information is especially useful if you want to add new hardware to your system. For example, most hardware boards need a few I/O addresses to communicate with the CPU and the operating system. If you configured two boards to use the same I/O addresses, disaster is about to happen. You can avoid this by checking which I/O addresses the kernel has already detected as being in use:

>     tigger # more /proc/ioports
>     0000-001f : dma1
>     0020-003f : pic1
>     0040-005f : timer
>     0060-006f : keyboard
>     0080-009f : dma page reg
>     00a0-00bf : pic2
>     00c0-00df : dma2
>     00f0-00ff : npu
>     01f0-01f7 : ide0
>     0220-022f : soundblaster
>     02e8-02ef : serial(auto)
>     0388-038b : OPL3/OPL2
>     03c0-03df : vga+
>     03f0-03f5 : floppy
>     03f6-03f6 : ide0
>     03f7-03f7 : floppy DIR
>     03f8-03ff : serial(auto)
>     0530-0533 : WSS config
>     0534-0537 : MSS audio codec
>     e000-e0be : aic7xxx
>     e400-e41f : eth0

Now you can look for IO addresses that are free. Of course, the kernel can show IO addresses only for boards that it has detected and recognized, but in a correctly configured system, this should be the case for all boards.

You can use the /proc filesystem for the other information that you might need for configuring new hardware as well: /proc/interrupts lists the occupied interrupt lines (IRQs) and /proc/dma lists the DMA (direct memory access) channels in use.

Copyright © 2001 O'Reilly & Associates. All rights reserved.